var jEasing = {
        linear: function (n) {
            return n;
        },
        quadIn: function (n) {
            return Math.pow(n, 2);
        },
        quadOut: function (n) {
            return n * (n - 2) * -1;
        },
        quadInOut: function (n) {
            n = n * 2;
            if (n < 1) {
                return Math.pow(n, 2) / 2;
            }
            return -1 * ((--n) * (n - 2) - 1) / 2;
        },
        cubicIn: function (n) {
            return Math.pow(n, 3);
        },
        cubicOut: function (n) {
            return Math.pow(n - 1, 3) + 1;
        },
        cubicInOut: function (n) {
            n = n * 2;
            if (n < 1) {
                return Math.pow(n, 3) / 2;
            }
            n -= 2;
            return (Math.pow(n, 3) + 2) / 2;
        },
        quartIn: function (n) {
            return Math.pow(n, 4);
        },
        quartOut: function (n) {
            return -1 * (Math.pow(n - 1, 4) - 1);
        },
        quartInOut: function (n) {
            n = n * 2;
            if (n < 1) {
                return Math.pow(n, 4) / 2;
            }
            n -= 2;
            return -1 / 2 * (Math.pow(n, 4) - 2);
        },
        quintIn: function (n) {
            return Math.pow(n, 5);
        },
        quintOut: function (n) {
            return Math.pow(n - 1, 5) + 1;
        },
        quintInOut: function (n) {
            n = n * 2;
            if (n < 1) {
                return Math.pow(n, 5) / 2;
            }
            n -= 2;
            return (Math.pow(n, 5) + 2) / 2;
        },
        sineIn: function (n) {
            return -1 * Math.cos(n * (Math.PI / 2)) + 1;
        },
        sineOut: function (n) {
            return Math.sin(n * (Math.PI / 2));
        },
        sineInOut: function (n) {
            return -1 * (Math.cos(Math.PI * n) - 1) / 2;
        },
        expoIn: function (n) {
            return (n == 0) ? 0 : Math.pow(2, 10 * (n - 1));
        },
        expoOut: function (n) {
            return (n == 1) ? 1 : (-1 * Math.pow(2, -10 * n) + 1);
        },
        expoInOut: function (n) {
            if (n == 0) {
                return 0;
            }
            if (n == 1) {
                return 1;
            }
            n = n * 2;
            if (n < 1) {
                return Math.pow(2, 10 * (n - 1)) / 2;
            }--n;
            return (-1 * Math.pow(2, -10 * n) + 2) / 2;
        },
        circIn: function (n) {
            return -1 * (Math.sqrt(1 - Math.pow(n, 2)) - 1);
        },
        circOut: function (n) {
            n = n - 1;
            return Math.sqrt(1 - Math.pow(n, 2));
        },
        circInOut: function (n) {
            n = n * 2;
            if (n < 1) {
                return -1 / 2 * (Math.sqrt(1 - Math.pow(n, 2)) - 1);
            }
            n -= 2;
            return 1 / 2 * (Math.sqrt(1 - Math.pow(n, 2)) + 1);
        },
        backIn: function (n) {
            var s = 1.70158;
            return Math.pow(n, 2) * ((s + 1) * n - s);
        },
        backOut: function (n) {
            n = n - 1;
            var s = 1.70158;
            return Math.pow(n, 2) * ((s + 1) * n + s) + 1;
        },
        backInOut: function (n) {
            var s = 1.70158 * 1.525;
            n = n * 2;
            if (n < 1) {
                return (Math.pow(n, 2) * ((s + 1) * n - s)) / 2;
            }
            n -= 2;
            return (Math.pow(n, 2) * ((s + 1) * n + s) + 2) / 2;
        },
        elasticIn: function (n) {
            if (n == 0 || n == 1) {
                return n;
            }
            var p = 0.3;
            var s = p / 4;
            n = n - 1;
            return -1 * Math.pow(2, 10 * n) * Math.sin((n - s) * (2 * Math.PI) / p);
        },
        elasticOut: function (n) {
            if (n == 0 || n == 1) {
                return n;
            }
            var p = 0.3;
            var s = p / 4;
            return Math.pow(2, -10 * n) * Math.sin((n - s) * (2 * Math.PI) / p) + 1;
        },
        elasticInOut: function (n) {
            if (n == 0) {
                return 0;
            }
            n = n * 2;
            if (n == 2) {
                return 1;
            }
            var p = 0.3 * 1.5;
            var s = p / 4;
            if (n < 1) {
                n -= 1;
                return -0.5 * (Math.pow(2, 10 * n) * Math.sin((n - s) * (2 * Math.PI) / p));
            }
            n -= 1;
            return 0.5 * (Math.pow(2, -10 * n) * Math.sin((n - s) * (2 * Math.PI) / p)) + 1;
        },
        bounceIn: function (n) {
            return (1 - jEasing.bounceOut(1 - n));
        },
        bounceOut: function (n) {
            var s = 7.5625;
            var p = 2.75;
            var l;
            if (n < (1 / p)) {
                l = s * Math.pow(n, 2);
            } else {
                if (n < (2 / p)) {
                    n -= (1.5 / p);
                    l = s * Math.pow(n, 2) + 0.75;
                } else {
                    if (n < (2.5 / p)) {
                        n -= (2.25 / p);
                        l = s * Math.pow(n, 2) + 0.9375;
                    } else {
                        n -= (2.625 / p);
                        l = s * Math.pow(n, 2) + 0.984375;
                    }
                }
            }
            return l;
        },
        bounceInOut: function (n) {
            if (n < 0.5) {
                return jEasing.bounceIn(n * 2) / 2;
            }
            return (jEasing.bounceOut(n * 2 - 1) / 2) + 0.5;
        }

}
jarvis.extend(jEasing);